package rpg.view;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import rpg.narrativa.Narrativa;
import rpg.personagem.Mensageiro;
import utilitarios.classes.Utilitaria;

/**
 * FrameLogin
 *
 * @author Gabriel Bronzatti Moro
 * @since 27/02/2013
 * @version 0.1
 */
public class FrameLogin extends JFrame {

    private Narrativa narrativa;
    private Container principal;
    private JLabel recebeImg;
    private JLabel textoBoasVIndas;
    private JTextField campoText;
    private JButton botaoSalvar;
    private JButton botaoSair;
    private Font font;
    private JPanel panelButtons;
    private framePrincipal framePrincipal;
    private JPanel panelDialogo;

    /**
     * Método construtor responsável pela inicialização dos componentes de
     * interfaces...
     */
    public FrameLogin(Narrativa instance) {
        super("RPG SOLO- Boas vindas");
        this.principal = getContentPane();

        this.font = new Font("serif", Font.BOLD | Font.ITALIC, 14);

        this.recebeImg = new JLabel(new ImageIcon(getClass().getResource("/img/mens_img.jpg")));

        this.textoBoasVIndas = new JLabel("Seja bem-vindo mensageiro...Digite seu nome, para iniciar a aventura:");
        this.campoText = new JTextField();
        this.textoBoasVIndas.setFont(this.font);
        this.campoText.setFont(this.font);

        this.botaoSalvar = new JButton("Play");
        this.botaoSalvar.setIcon(new ImageIcon(getClass().getResource("/img/play_icon.png")));
        this.botaoSalvar.addActionListener(new TrataPlay());

        this.botaoSair = new JButton("Sair");
        this.botaoSair.setIcon(new ImageIcon(getClass().getResource("/img/cancel_icon.png")));
        this.botaoSair.addActionListener(new TrataSair());

        this.panelDialogo = new JPanel();
        this.panelDialogo.setLayout(new GridLayout(4, 1));
        this.panelDialogo.add(this.textoBoasVIndas);
        this.panelDialogo.add(this.campoText);

        this.panelButtons = new JPanel();
        this.panelButtons.setLayout(new GridLayout(1, 2));
        this.panelButtons.add(this.botaoSalvar);
        this.panelButtons.add(this.botaoSair);

        setLayout(new BorderLayout());
        add(BorderLayout.NORTH, this.recebeImg);
        add(BorderLayout.CENTER, this.panelDialogo);
        add(BorderLayout.SOUTH, this.panelButtons);

        this.narrativa = instance;

        setVisible(true);
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);//impede saida de usuário pelo x do frame
        setResizable(false);//impede usuário de maximização de janela
        setSize(450, 400);
        setLocationRelativeTo(null);//Centraliza JFRAME
    }

    /**
     * Classe privada destinada a implementar o a interface listener para que
     * através dela o objeto listener seja registrado nos possíveis eventos dos
     * JButtons Classe TrataPlay é responsável por chamar o método da narrativa
     * iniciarJogo que levanta toda a aplicação, através do evento é possível
     * enviar para a classe narrativa o nomeDoMensageiro para configuração do
     * mesmo.
     */
    private class TrataPlay implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            if (narrativa.iniciarJogo(Utilitaria.lerTexto(campoText.getText()))) {
                mensagemConfirmacao(narrativa.getMensageiro());
                FrameLogin.this.dispose();
                framePrincipal = new framePrincipal(narrativa);
                framePrincipal.setVisible(true);
                limparCampos();
            }
        }
    }

    /**
     * Classe privada destinada a implementar o a interface listener para que
     * através dela o objeto listener seja registrado nos possíveis eventos dos
     * JButtons TrataSair é responsável por encerrar a aplicação
     */
    private class TrataSair implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(null, "Encerrando jogo...", "Alerta à Usuário", JOptionPane.ERROR_MESSAGE);
            
            System.exit(0);
        }
    }

    /**
     * Método limparCampos reponsável por limpar seus campos, ele é chamado em
     * diversos momentos
     */
    public void limparCampos() {
        this.campoText.setText("");
    }
    
    /**
     * Método responsável por enviar feedback ao usuário
     * @param mensageiro 
     */

    private void mensagemConfirmacao(Mensageiro mensageiro) {
        JOptionPane.showMessageDialog(null, "Seja bem-vindo mensageiro " + mensageiro.getNome(), "Boas vindas", JOptionPane.INFORMATION_MESSAGE);
    }
}